//package com.hitown.aspect;
//
//import com.alibaba.fastjson.JSON;
//import com.hitown.annotation.LoginLog;
//import com.hitown.model.system.SystemLog;
//import com.hitown.util.CopyUtil;
//import com.hitown.util.IpUtil;
//import com.hitown.util.ServerCallLoginLogUtil;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.context.annotation.Scope;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.UUID;
//
//
//@Aspect  // 作用是把当前类标识为一个切面供容器读取
//@Component //@component （把普通pojo实例化到spring容器中，相当于配置文件中的<bean id="" class=""/>）
//@Scope("prototype") // @Scope(“prototype”)来改变。可以使用以下方式指定初始化方法和销毁方法（方法名任意）： @PostConstruct public void init() { }
//public class ServerLoginLog {
//
////	@Autowired
////	private LoginService loginService;
//
//	private static final Logger log = LoggerFactory.getLogger(ServerLoginLog.class);
//
//	//Controller层切点
//    @Pointcut("@annotation(com.hitown.annotation.LoginLog)")//Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分，一是表达式，二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符，因为表达式不直观，因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名，而不需要在方法体内编写实际代码。
//    public  void controllerAspect() {
//    }
//
//
//    @SuppressWarnings("unchecked")
////    @AfterReturning(pointcut="controllerAspect()",returning="result") // ：后置增强，相当于AfterReturningAdvice，方法正常退出时执行
//    public Object afterReturning(JoinPoint pjp,Map<String, Object> result) throws Throwable{
//		log.info("进入afterReturning------------");
//    	//环绕通知执行原方法
//    	Object[] object = pjp.getArgs();
//    	//获取请求的ip的地址
//    	try {
//    		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//    		Map<String, Object> paramMap = CopyUtil.copyToMap(request);
//    		Map<String, Object> resultMap = getControllerMethodDescription(pjp);
//    		paramMap.put("ip", request.getRemoteAddr());//调用方IP地址
//    		String ip = IpUtil.getIpAddr(request);
//    		String content = String.valueOf(resultMap.get("content"));
//    		String module = String.valueOf(resultMap.get("module"));
//    		String code = String.valueOf(result.get("code"));
//    		//实体
//    		SystemLog log = new SystemLog();
//    		  //map转字符串
//    		String jsonString = JSON.toJSONString(paramMap);
//    		log.setLogDetail(jsonString);
//			log.setId(UUID.randomUUID().toString().replaceAll("\\-", ""));
//			log.setIp(ip);
//			log.setLogType("2");
//			log.setLogContent(content); //操作内容
//			log.setLogModule(module); //操作模块
//			log.setLogResult(String.valueOf(result.get("msg"))); //操作结果
//			if (!code.equals("1")) {
//				log.setLogCause(String.valueOf(result.get("data"))); //失败原因
//			}
//    		//开启一个线程 不阻塞
//    		ServerCallLoginLogUtil.put(log);
//		} catch (Exception e) {
//			e.printStackTrace();
//		    //记录本地异常日志
//		    log.info("==后置通知异常==");
//		    log.info("异常信息:{}", e.getMessage());
//		}
//    		return object;
//    }
//
//    @Around("controllerAspect()")
//    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
//        log.info("进入Around------------");
//        //环绕通知执行原方法
//        Object proceed = pjp.proceed();
//        try {
//            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//            Map<String,Object> map = new HashMap<String,Object>();
//            Map<String, Object> paramMap = getControllerMethodDescription2(pjp);
//            paramMap.put("ip", request.getRemoteAddr());//调用方IP地址
//            String content =paramMap.get("content").toString();//请求参数
//            String module =paramMap.get("module").toString();
//            String logDetail =paramMap.get("logDetail").toString();
//            Map<String, Object> result=(Map<String, Object>) proceed;
//            SystemLog systemLog = new SystemLog();
//            //map转字符串
//
//            systemLog.setLogDetail(logDetail);
//            systemLog.setId(UUID.randomUUID().toString().replaceAll("\\-", ""));
//            systemLog.setIp(IpUtil.getIpAddr(request));
//            systemLog.setLogType("2");
//            systemLog.setLogContent(content); //操作内容
//            systemLog.setLogModule(module); //操作模块
//            if(result == null){
//                systemLog.setLogResult("error"); //操作结果
//                systemLog.setLogCause("接口无返回值");
//            }else{
//                String code = result.get("code").toString();
//                if (code.equals("1")) {
//                    systemLog.setLogResult("success"); //操作结果
//                }else{
//                    systemLog.setLogResult("error"); //操作结果
//                    systemLog.setLogCause(String.valueOf(result.get("msg")));
//                }
//            }
//            //开启一个线程 不阻塞
//            ServerCallLoginLogUtil.put(systemLog);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//        return proceed;
//    }
//
//    /**
//     * 获取注解中对方法的描述信息 用于Controller层注解
//     *
//     * @param pjp 切点
//     * @return 方法描述
//     * @throws Exception
//     */
//    public  static Map<String,Object> getControllerMethodDescription(JoinPoint pjp)  throws Exception {
//    	Map<String,Object> result = new HashMap<String, Object>();
//        String targetName = pjp.getTarget().getClass().getName();
//        String methodName = pjp.getSignature().getName();
//        result.put("class", pjp.getTarget().getClass().getName());
//        Object[] arguments = pjp.getArgs();
//        HttpServletRequest request =(HttpServletRequest) arguments[0];
//        Map<String, Object> logDetail = CopyUtil.copyToMap(request);
//        Class targetClass = Class.forName(targetName);
//        Method[] methods = targetClass.getMethods();
//        for (Method method : methods) {
//            if (method.getName().equals(methodName)) {
//                Class[] clazzs = method.getParameterTypes();
//                if (clazzs.length == arguments.length) {
//                    String content = method.getAnnotation(LoginLog.class).content();
//                    String module = method.getAnnotation(LoginLog.class).module();
//                    result.put("content", content);
//                    result.put("module", module);
//                    break;
//                }
//            }
//        }
//        return result;
//    }
//
//    public  static Map<String,Object> getControllerMethodDescription2(ProceedingJoinPoint pjp)  throws Exception {
//        Map<String,Object> result = new HashMap<String, Object>();
//        String targetName = pjp.getTarget().getClass().getName();
//        String methodName = pjp.getSignature().getName();
//        result.put("class", pjp.getTarget().getClass().getName());
//        Object[] arguments = pjp.getArgs();
////        HttpServletRequest request =(HttpServletRequest) arguments[0];
////        Map<String, Object> logContent = CopyUtil.copyToMap(request);
//        result.put("logDetail", arguments[0]);
//        Class targetClass = Class.forName(targetName);
//        Method[] methods = targetClass.getMethods();
//        //获取参数名称和值
//        for (Method method : methods) {
//            if (method.getName().equals(methodName)) {
//                Class[] clazzs = method.getParameterTypes();
//                if (clazzs.length == arguments.length) {
//                    String content = method.getAnnotation(LoginLog.class).content();
//                    String module = method.getAnnotation(LoginLog.class).module();
//                    result.put("content", content);
//                    result.put("module", module);
//                    break;
//                }
//            }
//        }
//
//        return result;
//    }
//
//    public static String getUUID() {
//        String uuid = UUID.randomUUID().toString();
//        return uuid.replaceAll("\\-", "");
//    }
//}
